strtok関数は、文字列から区切り文字で区切られた字句を取り出します。
#include <string.h>
char *strtok(char *str, const char *delim);
*strは解析対象の文字列を指定します。
*delimnは区切り文字を文字列で指定します。
戻り値として、字句が取り出せた場合は、取り出した字句の文字列を返します。取り出せなかった場合はNULLを返します。
strtok関数を最初に呼び出す際には、第1引数の*strには解析対象の文字列を指定しますが、同じ文字列の解析を引き続き行うための、その後の呼び出しではNULLを指定します。第2引数の*delimnは、その都度変更しても構いません。
解析対象の文字列に2つ以上の区切り文字が連続している場合には、一つの区切り文字とみなします。また、文字列の先頭や末尾にある区切り文字は無視します。
第1引数の*strの内容は変更されてしまいますので、注意してください。
プログラム 例
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 1024 int main() { FILE *fp; char buff[BUFF_SIZE]; char *token; if ((fp = fopen('beijing_2008.csv', 'r')) == NULL) { fprintf(stderr, 'ファイルのオープンに失敗しました\n'); exit(1); } /* メンバー情報入力 */ while(fgets(buff, BUFF_SIZE, fp) != NULL) { /* 番号取り出し */ token = strtok(buff, ','); /* 名前取り出し */ if ((token = strtok(NULL, ',')) != NULL) { printf('%s\n', token); } } return 0; }
例の実行結果
$ cat beijing_2008.csv 1,kurihara,186,69,305 2,tajimi,180,70,309 3,takesita,159,52,280 4,oomura,184,70,319 5,takahasi,170,65,290 6,sano,159,54,260 7,sugiyama,184,66,310 8,sakurai,167,63,290 9,kanou,174,65,298 11,araki,186,79,307 12,kimura,184,66,298 14,kawai,168,63,280 $ $ ./strtok.exe kurihara tajimi takesita oomura takahasi sano sugiyama sakurai kanou araki kimura kawai $